package _1_1_Basic;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

/**
 * 深度复制、深度克隆、深度clone
 * 1. 实现 Cloneable接口,重写clone方法
 * 2. 使用手工代码 new Object, 然后set(get()) 方法
 * 2.1 使用 MapStruct 简化代码
 * 3. 使用序列化
 */
public class DeepClone implements Cloneable{

    // 深浅复制--引用传递--值传递
    @Test
    public void useDengHao() {
        List<String> old = new ArrayList<>();
        old.add("0");
        old.add("1");
        old.add("2");
        old.add("3");
        old.add("4");

        // 使用 = 给新变量赋一个旧 的变量
        List<String> newS = old;
        // 改变新变量的值
        newS.set(0, "new_0");
        // 旧的变量也会改变，因为上面给新变量赋值时，传递的引用，而不是值
        System.out.println(old);
    }

    // 深浅复制--引用传递--值传递
    @Test
    public void useDeepCopy() {
        List<String> old = new ArrayList<>();
        old.add("0");
        old.add("1");
        old.add("2");
        old.add("3");
        old.add("4");

        // 使用 = 给新变量 使用构造器重新创建
        List<String> list = new ArrayList<>(old);
        // 改变新变量的值
        list.set(0, "new_0");
        // 旧的变量不会改变
        System.out.println(list);
        System.out.println(old);
    }
}
